package capaDatos;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import utiles.UIDGenerator;

import capaLogica.Mensaje;
import capaLogica.Noticia;
import capaLogica.PerfilConcurso;

public class MensajeDAO {

	/**
	 * Atributo que crea la conexion a la bd
	 */
	private Connection conn;
	
	/**
	 * Constructor de la clase
	 */
	public MensajeDAO(){
		conn = (Connection) ConnectionManager.getInstance().checkOut();
	}
	
	@Override
	 protected void finalize() {
       ConnectionManager.getInstance().checkIn(conn);
	}
	
	public List<Mensaje> recuperarMensajesRecibidos(String idUsuario) {
        PreparedStatement stmt = null;
        ResultSet result = null;
        List<Mensaje> listaMensajes = new ArrayList<Mensaje>();
        String sql = "SELECT * FROM mensaje WHERE (idUserReceptor = ?) AND (recomendado = 0 ) ORDER BY fechaPublicacion DESC";

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, idUsuario);
            result = stmt.executeQuery();

            while ( result.next() ){
	            Mensaje p = new Mensaje();
	            p.setIdMensaje(result.getString("idMensaje"));
	            p.setIdUsuarioCreador(result.getString("idUserCreador"));
	            p.setIdUsuarioReceptor(result.getString("idUserReceptor"));
	            p.setDescripcion(result.getString("descripcion"));
	            p.setFechaPublicacion(result.getDate("fechaPublicacion"));
	            p.setLeido(result.getString("leido"));
	            p.setRecomendaciones(result.getString("recomendado"));
	            listaMensajes.add(p);
            }
            
        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
            try {
                if (result != null) {
                    result.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }
        return listaMensajes;
    }
	
	public List<Mensaje> recuperarMensajesEnviados(String idUsuario) {
        PreparedStatement stmt = null;
        ResultSet result = null;
        List<Mensaje> listaMensajes = new ArrayList<Mensaje>();
        String sql = "SELECT * FROM mensaje WHERE (idUserCreador = ?) AND (recomendado = 0 ) ORDER BY fechaPublicacion DESC ";

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, idUsuario);
            result = stmt.executeQuery();

            while ( result.next() ){
	            Mensaje p = new Mensaje();
	            p.setIdMensaje(result.getString("idMensaje"));
	            p.setIdUsuarioCreador(result.getString("idUserCreador"));
	            p.setIdUsuarioReceptor(result.getString("idUserReceptor"));
	            p.setDescripcion(result.getString("descripcion"));
	            p.setFechaPublicacion(result.getDate("fechaPublicacion"));
	            p.setLeido(result.getString("leido"));
	            p.setRecomendaciones(result.getString("recomendado"));
	            listaMensajes.add(p);
            }
            
        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
            try {
                if (result != null) {
                    result.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }
        return listaMensajes;
    }
	
	public List<Mensaje> recuperarFavoritos(String idUsuario) {
        PreparedStatement stmt = null;
        ResultSet result = null;
        List<Mensaje> listaMensajes = new ArrayList<Mensaje>();
        String sql = "SELECT * FROM mensaje WHERE (idUserReceptor = ?) AND (recomendado = 1 ) ORDER BY fechaPublicacion DESC";

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, idUsuario);
            result = stmt.executeQuery();

            while ( result.next() ){
	            Mensaje p = new Mensaje();
	            p.setIdMensaje(result.getString("idMensaje"));
	            p.setIdUsuarioCreador(result.getString("idUserCreador"));
	            p.setIdUsuarioReceptor(result.getString("idUserReceptor"));
	            p.setDescripcion(result.getString("descripcion"));
	            p.setFechaPublicacion(result.getDate("fechaPublicacion"));
	            p.setLeido(result.getString("leido"));
	            p.setRecomendaciones(result.getString("recomendado"));
	            listaMensajes.add(p);
            }
            
        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
            try {
                if (result != null) {
                    result.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }
        return listaMensajes;
    }
	
	public Mensaje recuperarMensajeById(String idMensaje) {
        PreparedStatement stmt = null;
        ResultSet result = null;
        Mensaje p = null;
        String sql = "SELECT * FROM mensaje WHERE (idMensaje = ?) ";

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, idMensaje);
            result = stmt.executeQuery();

            if ( result.next() ){
	            p = new Mensaje();
	            p.setIdMensaje(result.getString("idMensaje"));
	            p.setIdUsuarioCreador(result.getString("idUserCreador"));
	            p.setIdUsuarioReceptor(result.getString("idUserReceptor"));
	            p.setDescripcion(result.getString("descripcion"));
	            p.setFechaPublicacion(result.getDate("fechaPublicacion"));
	            p.setLeido(result.getString("leido"));
	            p.setRecomendaciones(result.getString("recomendado"));
            }
            
        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
            try {
                if (result != null) {
                    result.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }
        return p;
    }
	
	 public Mensaje insertarMensaje(Mensaje n) {
			String sql = "INSERT INTO mensaje (idMensaje,idUserCreador,idUserReceptor,descripcion,fechaPublicacion,leido,recomendado) VALUES (?,?,?,?,?,?,?) ";
			PreparedStatement stmt = null;
			
			try {
				stmt = conn.prepareStatement(sql);
				n.setIdMensaje(UIDGenerator.getInstance().getKey());
				
				java.util.Date fechaNoticia= n.getFechaPublicacion();
	            
				stmt.setString(1, n.getIdMensaje());
				stmt.setString(2, n.getIdUsuarioCreador());
				stmt.setString(3, n.getIdUsuarioReceptor());
				stmt.setString(4, n.getDescripcion());
				stmt.setDate(5, new java.sql.Date(fechaNoticia.getTime()));
				stmt.setString(6, n.getLeido());
				stmt.setString(7, n.getRecomendaciones());
			
				stmt.executeUpdate();

			} catch (SQLException e) {
				System.out.println("Message: " + e.getMessage());
				System.out.println("SQLState: " + e.getSQLState());
				System.out.println("ErrorCode: " + e.getErrorCode());
			} finally {
				try {
					if (stmt != null) {
						stmt.close();
						
					}
				} catch (SQLException e) {
				}
			}
			
			return n;
		}
	
	 public void actualizarMensaje(Mensaje p) {
			String sql = "UPDATE mensaje SET leido = ? WHERE (idMensaje = ?)";
			PreparedStatement stm = null;
			try {
				
				stm = conn.prepareStatement(sql);
				stm.setString(1, "1");
				stm.setString(2, p.getIdMensaje());
				
				stm.executeUpdate();

			} catch (SQLException e) {
				System.out.println("Message: " + e.getMessage());
				System.out.println("SQLState: " + e.getSQLState());
				System.out.println("ErrorCode: " + e.getErrorCode());
			} finally {
				try {
					if (stm != null) {
						stm.close();
					}
				} catch (SQLException e) {

				}
			}
		}
	 
	 public void borrarMensaje(String idNoticia) {
			PreparedStatement stm = null;
			String sql = "DELETE  FROM mensaje WHERE (idMensaje = ?)";
			try {
				stm = conn.prepareStatement(sql);
				stm.setString(1, idNoticia);
				stm.executeUpdate();
				
			} catch (SQLException e) {
				System.out.println("SQLMessage: " + e.getMessage());
				System.out.println("SQLState: " + e.getSQLState());
				System.out.println("ErrorCode: " + e.getErrorCode());
			} finally {
				try {
					if (stm != null) {
						stm.close();
					}
				} catch (SQLException e) {

				}
			}
		}	
}
